/*
 *  $Id: Resource.cs 1214 2010-11-24 10:30:04Z thenn.erannor $
 *  This file is a part of Ragima CCG.
 *  (C) 2008-2010 Ragima development group.
 *
 *  Licensed under the terms of the GNU GPL License version 2.
 *
 */

namespace Ragima.UI {
    /// <summary>
    /// Ресурс: обертка над идентификатором для получения ресурса.
    /// </summary>
    public class Resource {
        private string _id;

        public Resource(string id) {
            _id = id;
        }

        /// <summary>
        /// Идентификатор ресурса.
        /// </summary>
        public virtual string Id {
            get { return _id; }
            set { _id = value; }
        }

        /// <summary>
        /// Проверяет наличие ресурса.
        /// </summary>
        public virtual bool Available {
            get { return !string.IsNullOrEmpty(_id); }
        }

        /// <summary>
        /// Проверяет наличие ресурса (а так же на null).
        /// </summary>
        public static bool Exists(Resource resource) {
            return resource != null && resource.Available;
        }
    }

    /// <summary>
    /// Типизированный ресурс: запрашивает при первом обращении нужный ресурс по идентификатору, далее выдает уже полученный.
    /// </summary>
    public class Resource<T> : Resource where T : class {
        private T _data;

        public Resource(string id) : base(id) {
            _data = null;
        }

        /// <summary>
        /// Идентификатор ресурса.
        /// При изменении так же очищается ранее сохраненный ресурс.
        /// </summary>
        public override string Id {
            set {
                base.Id = value;
                _data = null;
            }
        }

        /// <summary>
        /// Проверяет наличие ресурса.
        /// </summary>
        public override bool Available {
            get { return base.Available && Data != null; }
        }

        /// <summary>
        /// Объект ресурса. Ищется при первом обращении.
        /// </summary>
        public T Data {
            get {
                if (_data == null)
                    _data = ResourceManager.GetResource<T>(Id);
                return _data;
            }
        }

        public static implicit operator Resource<T>(string id) {
            return !string.IsNullOrEmpty(id) ? new Resource<T>(id) : null;
        }
    }
}
